﻿
//递归和非递归分别实现求第n个斐波那契数
//例如：
//输入：5  输出：5
//输入：10， 输出：55
//输入：2， 输出：1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int  fib(int n)
//{
//	int a = 1;
//	int b = 1;
//	int c = 1;
//	while (n>2)
//	{
//		c = a + b;
//		a = b;
//		b = c;
//		n--;
//	}
//	return c;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	printf("%d", fib(n));
//	return 0;
//}


/*作业标题(682)
递归实现n的k次方
作业内容
编写一个函数实现n的k次方，使用递归实现*/

//int f(int n,int k)
//{
//	if (k == 0)
//		return 1;
//	else if(n >=1)
//		return f(n,k -1) * n;
//}
//
//int main()
//{
//	int k = 0;
//	int n = 0;
//	scanf("%d %d", &n, &k );
//	printf("%d", f(n, k));
//	return 0;
//}


//作业标题(683)
//计算一个数的每位之和（递归实现）
//作业内容
//写一个递归函数DigitSum(n)，输入一个非负整数，返回组成它的数字之和
//例如，调用DigitSum(1729)，则应该返回1 + 7 + 2 + 9，它的和是19
//输入：1729，输出：19

//int DigitSum(unsigned int  n)
//{
//	if (n > 9)
//		return DigitSum(n / 10) + n % 10;
//	else
//		return n;
//}
//int main()
//{
//	unsigned int n = 0;
//	scanf("%u", &n);
//	printf("%d", DigitSum(n));
//	return 0;
//}


//作业内容
//编写一个函数 reverse_string(char* string)（递归实现）
//实现：将参数字符串中的字符反向排列，不是逆序打印。
//要求：不能使用C函数库中的字符串操作函数。
//比如 :
//char arr[] = "abcdef";
//逆序之后数组的内容变成：fedcba
//int MyStrlen(const char* p)
//{
//	if (*p != '\0')
//		return 1 + MyStrlen(p + 1);
//}
//void reverse_string(char * star)
//{
//	int len = MyStrlen(star);
//	char temp = *star;
//	*star = *(star + len - 1);
//	*(star + len - 1) = '\0';
//
//	if (MyStrlen(star + 1) >= 2)
//		reverse_string(star + 1);
//	*(star + len - 1) = temp;
//}
//
//
//
//int main()
//{
//	char arr[] = "abcdef";
//	reverse_string(arr);
//	printf("%s", arr);
//	return 0;
//}


//作业标题(685)
//strlen的模拟（递归实现）
//作业内容
//
//递归和非递归分别实现strlen
//int MyStrlen(const char* p)
//{
//	if (*p != '\0')
//		return 1 + MyStrlen(p + 1);
//}
//int MyStrlen(const char* p)
//{
//	int count = 0;
//	while(*p != '\0')
//	{
//		count++;
//		p++;
//	}
//	return count;		
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//	printf("%d", MyStrlen(arr));
//	return 0;
//}

//作业标题(686)
//求阶乘
//作业内容
//
//递归和非递归分别实现求n的阶乘（不考虑溢出的问题）

//int f(int n)
//{
//	int ret = 1;
//	for (int i = 1; i <= n; i++)
//	{
//		ret *= i;
//	}
//	return ret;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	printf("%d", f(n));
//}

//作业标题(687)
//打印一个数的每一位
//作业内容
//
//递归方式实现打印一个整数的每一位
//
//void print(int n)
//{
//	if (n > 9)
//		print(n / 10);
//	printf("%d ", n % 10);
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	print(n);
//	return 0;
//}

int MyStrlen(const char* p)
{
    if (*p != '\0')
        return 1 + MyStrlen(p + 1);
    else
        return 0;
}

int main()
{
    char arr[] = "abcdef";
    printf("%d", MyStrlen(arr));
    return 0;
}
//非递归实现
//int MyStrlen(const char* p)
//{
//    int count = 0;
//    while (*p != '\0')
//    {
//        count++;
//        p++;
//    }
//    return count;
//}
//
//int main()
//{
//    char arr[] = "abcdef";
//    printf("%d", MyStrlen(arr));
//    return 0;
//}